今天雖然還是很忙,但太久沒寫 Pwn 了,不能再混了~
接續上次的那題:
#include <stdio.h>
#include <stdlib.h>
void game() {
long val = 0xdeadbeef;
char buf[4] = "abcd";
printf("Input: ");
scanf("%4s",&buf);
printf("buf: %s\n",buf);
printf("val: 0x%08x\n",val);
if(val == 0xdeadbe00) {
printf("GOOD!!\n");
} else {
printf("BAD!!\n");
}
}
int main() {
game();
return 0;
}
在我們觀察下記憶體前,再多講一個 register:rbp
他是做甚麼用的呢?
低地址
==========================
| .text (程式碼) | //r-x
--------------------------
| .data (已初始化資料) | //rw-
--------------------------
| .bss (未初始化資料) | //rw-
--------------------------
| ↓ Heap | //rw-
--------------------------
| ↓ |
--------------------------
| |
--------------------------
| |
--------------------------
| ↑ |
--------------------------
| ↑ Stack | //rw-
===========================
高地址
還記得我們的 stack 嗎,stack 會從高地址往低地址方向長,而如同我們前幾篇講到的,只要呼叫個函式就會生成一塊 stack 區域來放函式裡的資料(補充:這區域稱為 stack frame)。而 stack 的底(高地址)會用 rbp 指著,stack 的頂(低地址)則會用 rsp 指著。
所以具體來說,執行時會變這樣:
以上這段修改 register 創建 stack frame 的程式稱為 prologue。
之後將會繼續看呼叫 game 時的狀況。
再來我們來介紹今天的主題:
絲子雜燴是河北八大碗的其中一道料理,絲子雜燴的意思是將食材切絲做成的雜燴。
(找不到圖,因此圖為八大碗,之後再來介紹八大碗。)